package me.sdevil507.org.service;

import me.sdevil507.org.dto.ExpertSearchDto;
import me.sdevil507.org.dto.TempExpertDto;
import me.sdevil507.org.po.OrgUserRelPo;
import me.sdevil507.org.po.TempExpertPo;
import me.sdevil507.supports.jpa.PageParamsDTO;
import me.sdevil507.supports.jpa.SortParamsDTO;
import org.springframework.data.domain.Page;

import java.util.List;
import java.util.Set;

/**
 * Api用户Service
 *
 * @author sdevil507
 * created on 2019/12/15
 */
public interface TempExpertService {

    /**
     * 根据手机号码获取用户信息
     *
     * @param phoneNumber 手机号码
     * @return 用户信息
     */
    TempExpertPo readOneByPhoneNumber(String phoneNumber);

    /**
     * 判断手机号码是否存在
     *
     * @param phoneNumber 手机号码
     * @return 反馈
     */
    boolean existsByPhoneNumber(String phoneNumber);

    /**
     * 根据手机号码更新密码
     *
     * @param newPassword 新密码
     * @param phoneNumber 手机号码
     */
    void updatePasswordByPhoneNumber(String newPassword, String phoneNumber);


    /**
     * 删除用户
     *
     * @param id 用户id
     */
    void delete(Long id);

    /**
     * 创建属于机构id下的用户
     * @param po   用户参数
     */
    TempExpertPo create(TempExpertPo po);


    /**
     * 查询记录列表
     *
     * @param dto 查询参数
     * @return 列表
     */
    List<TempExpertPo> readAll(TempExpertDto dto, SortParamsDTO sortParamsDto);

    /**
     * 分页获取记录
     *
     * @param dto 查询DTO
     * @param pageParamsDto   分页DTO
     * @param sortParamsDto   排序DTO
     * @return 分页记录
     */
    Page<TempExpertPo> readAllByPage(TempExpertDto dto, PageParamsDTO pageParamsDto, SortParamsDTO sortParamsDto);

    /**
     * 获取带邀请临时专家
     *
     * @param dto 查询DTO
     * @param pageParamsDto   分页DTO
     * @param sortParamsDto   排序DTO
     * @return 分页记录
     */
    Page<TempExpertPo> getInvited(TempExpertDto dto, PageParamsDTO pageParamsDto, SortParamsDTO sortParamsDto);

    /**
     * 重置密码
     *
     * @param id          用户id
     * @param newPassword 密码
     */
    void resetPassword(Long id, String newPassword);


    /**
     * 创建属于机构id下的用户
     * @param dto   用户参数
     */
    /*void register(TempExpertDto dto) throws PhoneNumberExistedException;*/


    /**
     * 查询机构下所有正式专家信息
     * @return 机构和专家关联关系表
     */
    List<OrgUserRelPo> readAllExp(ExpertSearchDto dto);

    /**
     * @ClassName TempExpertService
            * @Description : 查询机构下所有临时专家
            *
            * @Return : java.util.List<me.sdevil507.org.po.TempExpertPo>
            * @Author : kzl
            * @Date : 2020/8/15 14:20
    */
    List<TempExpertPo> readAllByOrg(ExpertSearchDto dto);

    /**
     * @ClassName TempExpertService
            * @Description : 按照名称查找该机构下的专家或者临时专家信息
            *
            * @Return : me.sdevil507.org.dto.ExpertSearchDto
            * @Author : kzl
            * @Date : 2020/8/16 17:51
    */
    List<ExpertSearchDto>  searchByName(ExpertSearchDto dto);


    /**
     * @ClassName TempExpertService
            * @Description : 临时专家邀请后，变成正式专家
            *
     * @param tmpId  临时专家id
     * @param orgUserId  正式专家id
            * @Return : void
            * @Author : kzl
            * @Date : 2020/8/18 10:29
    */
    void  temporaryBecomeFormal(Long tmpId,Long orgUserId);


    /**
     * 判断姓名是否在本机构临时库下是否存在
     *
     * @param realName 手机号码
     * @param id          用户id
     * @param orgId       机构id
     * @return 执行反馈
     */
     boolean realNameExisted(String realName, Long id, Long orgId);

     List<ExpertSearchDto> findAllExpertOfOrg();

     List<ExpertSearchDto> findAllExpert(boolean isAll);
}
